#include "multi_button.h"
#include "device.h"
#include <string.h>

DEV_REG_DEF(multi_button, Multi_Button_t)

DEV_RET_t
multi_button_monitor(Device_t* pstDevice){

    // 输入参数检查
    if(NULL == pstDevice || NULL == pstDevice->pvFeature) return DEV_PARAM_ERR;

    // 设备检测
    CHECK_DEVICE(pstDevice);

    // 转换为Multi_Button_t结构体
    Multi_Button_t *pstBtn = GET_DEVICE(pstDevice, Multi_Button_t);

    // 输入参数检查
    if(NULL == pstBtn->HW.pfnRead) return DEV_PARAM_ERR;

    // 按键心跳计数
    pstBtn->SW.u8Tick++;
    
    // 判断是否被按下过 -- 按下时间>0时标记为按钮曾被按下
    uint8_t u8IsPressed = (pstBtn->SW.u8PressedTick > 0);
    
    // 读取按键状态
    uint8_t u8NowState = pstBtn->HW.pfnRead();

    // 判断按键状态是否发生变化
    if(pstBtn->SW.u8State != u8NowState){

        // 更新状态
        pstBtn->SW.u8State = u8NowState;

        // 判断按键是否按下
        if(pstBtn->SW.u8State == pstBtn->SW.u8Active) {

            // 首次按键按下，重置心跳计数
            if(pstBtn->SW.u8PressedTick == 0) pstBtn->SW.u8Tick = 1;

            // 按键按下心跳计数
            pstBtn->SW.u8PressedTick++;
        }
        else {
            // 按键松开，按键次数+1
            if(u8IsPressed) pstBtn->SW.u8Count++;

            // 多次按下，计数器清零
            if(pstBtn->SW.u8Count > 1) pstBtn->SW.u8PressedTick = 0;
        }
    }
    else if(u8NowState == pstBtn->SW.u8Active && u8IsPressed){
        // 被按下过，且按键状态未发生改变，但持续按下状态，按下时间 +1
        pstBtn->SW.u8PressedTick++;
    }

    // 判断心跳是否超时
    if(pstBtn->SW.u8Tick >= pstBtn->SW.u8Interval){
        
        // 判断是否有事件发生
        if(pstBtn->SW.u8Count > 1){

            // 多击事件发生
            set_device_event(pstDevice, BUTTON_MULTI_CLICKED);
        }
        else if(pstBtn->SW.u8Count == 0){

            // 长按事件发生
            if(pstBtn->SW.u8PressedTick >= pstBtn->SW.u8Interval) 
                set_device_event(pstDevice, BUTTON_LONG_CLICKED);
        }
        else 
        {
            // 单击事件发生
            if(pstBtn->SW.u8PressedTick < pstBtn->SW.u8ShortTh)
                set_device_event(pstDevice, BUTTON_SINGLE_CLICKED);
            
            // 短按事件发生
            else set_device_event(pstDevice, BUTTON_SHORT_CLICKED);
        }

        // 重置心跳计数
        pstBtn->SW.u8Tick = 0;

        // 重置当前按下时间
        pstBtn->SW.u8PressedTick = 0;

        // 重置按键次数
        pstBtn->SW.u8Count = 0;
    }

    // 设备释放
    DEV_RETURN(DEV_OK);
}
